#include "stm32f10x.h"                  // Device header
#include "bsp_Led.h"
#include "usart.h"
#include "delay.h"

/* FreeRTOS头文件 */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"


 /* 创建任务句柄 */
 //定义两个可以放回任何类型的指针
static TaskHandle_t AppTaskCreate_Handle= NULL;
/* LED任务句柄 */
static TaskHandle_t LED1_Task_Handle= NULL;
static TaskHandle_t LED2_Task_Handle= NULL;


static void AppTaskCreate(void);/* 用于创建任务 */
static void LED1_Task(void* pvParameters);/* LED1_Task任务实现 */
static void LED2_Task(void* pvParameters);/* LED2_Task任务实现 */


static void STM32F1_Init(void);

int main(){
	BaseType_t xReturn = pdFAIL;/* 定义一个创建信息返回值，默认为pdPASS */
	STM32F1_Init();
	printf("FREERTOS TEST");
	
	xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate,  /* 任务入口函数 */
                        (const char*    )"AppTaskCreate",/* 任务名字 */
                        (uint16_t       )512,  /* 任务栈大小 */
                        (void*          )NULL,/* 任务入口函数参数 */
                        (UBaseType_t    )1, /* 任务的优先级 */
                        (TaskHandle_t*  )&AppTaskCreate_Handle);/* 任务控制块指针 */ 
												
	/* 启动任务调度 */           
  if(pdPASS == xReturn){
		printf("\r\n开启调度\r\n");
    vTaskStartScheduler();   /* 启动任务，开启调度 */
	}
  else
    return -1;  
	while(1){

	}
	
}

static void AppTaskCreate(void){
	BaseType_t xReturn = pdFAIL;/* 定义一个创建信息返回值，默认为pdPASS */
  
  taskENTER_CRITICAL();           //进入临界区
	
	/* 创建LED_Task任务 */
  xReturn = xTaskCreate((TaskFunction_t )LED1_Task, /* 任务入口函数 */
                        (const char*    )"LED1_Task",/* 任务名字 */
                        (uint16_t       )512,   /* 任务栈大小 */
                        (void*          )NULL,	/* 任务入口函数参数 */
                        (UBaseType_t    )2,	    /* 任务的优先级 */
                        (TaskHandle_t*  )&LED1_Task_Handle);/* 任务控制块指针 */
  if(pdPASS == xReturn)
    printf("\r\nLED1_Task任务成功\r\n");
	
		/* 创建LED_Task任务 */
  xReturn = xTaskCreate((TaskFunction_t )LED2_Task, /* 任务入口函数 */
                        (const char*    )"LED2_Task",/* 任务名字 */
                        (uint16_t       )512,   /* 任务栈大小 */
                        (void*          )NULL,	/* 任务入口函数参数 */
                        (UBaseType_t    )3,	    /* 任务的优先级 */
                        (TaskHandle_t*  )&LED2_Task_Handle);/* 任务控制块指针 */
  if(pdPASS == xReturn)
    printf("\r\nLED2_Task任务成功\r\n");
	
	vTaskDelete(AppTaskCreate_Handle); //删除AppTaskCreate任务
  
  taskEXIT_CRITICAL();            //退出临界区
}
static void LED1_Task(void* pvParameters)
{	
    while (1)
    {
        LED_G(1);
        vTaskDelay(500);   /* 延时500个tick */
        printf("LED1_Task Running,LED1_ON\r\n");
        
        LED_G(0);   
        vTaskDelay(500);   /* 延时500个tick */		 		
        printf("LED1_Task Running,LED1_OFF\r\n");
    }
}

static void LED2_Task(void* pvParameters)
{	
    while (1)
    {
        LED_B(1);
        vTaskDelay(1000);   /* 延时500个tick */
        printf("LED2_Task Running,LED2_ON\r\n");
        
        LED_B(0);     
        vTaskDelay(1000);   /* 延时500个tick */		 		
        printf("LED2_Task Running,LED2_OFF\r\n");
    }
}

static void STM32F1_Init(void){
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
	SystemInit();//配置系统时钟为72M，加不加这行代码都是默认72M，但是可以去这个函数里面修改M
	delay_init(72);
	USART1_Config();
	LED_CPIO_Init();
}
